<?php
// 应用公共文件

//根据pid转换树形数组
/**
 * 根据pid转换树形数组
 *
 * @param array $items 原始数据数组，每个元素需包含'id'和'pid'字段
 * @param int $pid 父级ID，默认0为根节点
 * @param string $pk 主键字段名，默认'id'
 * @param string $pidKey 父ID字段名，默认'pid'
 * @param string $childKey 子节点字段名，默认'children'
 * @return array 树形结构数组
 */
function list_to_tree($items, $pid = 0, $pk = 'id', $pidKey = 'pid', $childKey = 'children')
{
    $tree = [];
    foreach ($items as $item) {
        if ($item[$pidKey] == $pid) {
            $children = list_to_tree($items, $item[$pk], $pk, $pidKey, $childKey);
            if (!empty($children)) {
                $item[$childKey] = $children;
            }
            $tree[] = $item;
        }
    }
    return $tree;
}

/**
 * 生成Snowflake ID
 *
 * Snowflake ID是一种用于分布式系统中的唯一ID生成算法，由Twitter开源
 * 该算法可以根据时间戳、数据中心ID和机器ID生成一个唯一的ID
 *
 * @return string 生成的Snowflake ID，以字符串形式返回
 */
function generateSnowflakeId(): string
{
    // 从环境变量或配置文件中获取机器ID和数据中心ID
    // 默认值为1，适用于单机环境。在分布式环境中，请确保每个节点的SNOWFLAKE_MACHINE_ID和SNOWFLAKE_DATACENTER_ID唯一
    $machineId = getenv('SNOWFLAKE_MACHINE_ID') ?: 1;
    $datacenterId = getenv('SNOWFLAKE_DATACENTER_ID') ?: 1;

    try {
        // 创建Snowflake实例，并设置机器ID和数据中心ID
        $snowflake = new \Godruoyi\Snowflake\Snowflake($machineId, $datacenterId);

        // 生成并返回Snowflake ID，转换为字符串类型
        return (string)$snowflake->id();
    } catch (\Exception $e) {
        // 当Snowflake ID生成失败时，捕获异常并记录错误日志
        // 这里使用error_log记录错误，你可以根据你的日志系统进行调整
        error_log('Snowflake ID generation failed: ' . $e->getMessage());

        // 返回一个错误标识，具体值可根据业务需求调整
        // 这里返回'0'，调用者可以根据这个值来判断ID生成是否成功
        return '0';
    }
}


// 去除小数点后多余的0
/**
 * 移除浮点数的末尾零
 * 将给定的数字转换为字符串，如果包含小数点，则移除小数点后多余的零及小数点
 * @param float $number 需要处理的浮点数
 * @return string 处理后的字符串
 */
function removeTrailingZeros($number) {
    $number = (string)$number;
    if (strpos($number, '.') !== false) {
        $number = rtrim(rtrim($number, '0'), '.');
    }
    return $number;
}

/**
 * 检查字符串是否符合中国大陆手机号码格式
 * 使用正则表达式验证给定的值是否符合手机号码格式
 * @param string $value 需要验证的字符串
 * @return int 如果匹配成功返回1，否则返回0
 */
function isMobile($value)
{
    $rule = '^1(2|3|4|5|7|8|9)[0-9]\d{8}$^';
    return preg_match($rule, $value);
}

/**
 * 生成指定长度的随机验证码
 * 从给定的字符集中随机选择字符以生成验证码
 * @param int $length 验证码的长度，默认为6
 * @return string 生成的验证码
 */
function getRandomCode($length = 6) {
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $code = '';
    for ($i = 0; $i < $length; $i++) {
        $code .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $code;
}

/**
 * 验证给定的字符串是否符合中国大陆身份证号码格式
 * 使用正则表达式检查身份证号码的格式是否正确
 * @param string $value 需要验证的字符串
 * @return int 如果匹配成功返回1，否则返回0
 */
function isCard($value)
{
    $rule = '/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/';
    return preg_match($rule, $value);
}

/**
 * 使用cURL进行GET请求并获取网页内容
 * 初始化cURL会话，设置URL和其他选项，执行请求并返回结果
 * @param string $url 请求的URL
 * @param int $httpCode 返回的HTTP状态码
 * @return string 请求的网页内容
 */
function curl_get($url, &$httpCode = 0)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    //不做证书校验,部署在linux环境下请改为true
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    $file_contents = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    return $file_contents;
}

/**
 * 验证给定的日期字符串是否为有效的日期
 * 将日期字符串转换为时间戳，并与原始字符串比较以验证其有效性
 * @param string $date 日期字符串
 * @return bool 如果日期有效返回true，否则返回false
 */
function isValidDate($date)
{
    return !empty($date)?$date == date('Y-m-d H:i:s',strtotime($date)):false;
}




